package com.递归;

/**
 * the class of algorithm
 *
 * <p>
 * .
 *
 * @author little_lunatic
 * @date 2022-12-07
 */
public class Main {
    public static void main(String[] args) {
        System.out.println(fac1(10));
        System.out.println();

        fac2(Integer.MAX_VALUE);
        System.out.println("\n");

        System.out.println(fac3(4));

        System.out.println();
        hnt(3,'a','b','c');
    }

    /**
     * 1.递归求1+2+3+···+n
     */
    private static int fac1(int i) {
        if (i == 1) {
            return 1;
        }
        return i + fac1(i - 1);
    }

    /**
     * 2.按顺序打印一个数字的每一位
     */
    private static void fac2(int i) {
        if (i <= 9) {
            System.out.print(i + " ");
            return;
        }
        fac2(i / 10);
        System.out.print(i % 10 + " ");
    }

    /**
     * 3.斐波那契数列和青蛙跳台阶问题
     */
    private static int fac3(int i) {
        if (i <= 2) {
            return i;
        }
        return fac3(i - 1) + fac3(i - 2);
    }

    /**
     * 4.汉诺塔问题
     *
     * @param n  移动多少盘子
     * @param a   起始位置
     * @param b   中转位置
     * @param c   结束位置
     */
    private static void hnt(int n , char a, char b, char c) {
        if (n == 1) {
            move(a, c);
            return;
        }
        //把前 n-1 个盘子移动到 b
        hnt(n - 1, a, c, b);
        move(a, c);
        //把 b 上面的盘子移动到 c
        hnt(n -1 ,b, a, c);
    }

    // 显示移动路径
    public static void move(char pos1, char pos2) {
        System.out.println( pos1 + "-->" + pos2);
    }

}